package com.cy.pj.common.pool;

import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/*
    创建一个对象池类型，然后将此类型的对象交给spring管理
    @Componet注解描述的对象可以交给spring去管理，表示这个对象是一个一般的组件
    系统底层会通过反射技术创建bean实例，并为bean起一个名字

    反射？java中的一种高级特性，这组特性会借助一组API，获取运行时的类及其的成员，并进行操作。
    反射最大优势？不能预知未来，但能驾驭未来。
    Java中反射应用的起点是什么？ 获取Class对象
 */
@Component
@Scope("prototype")//prototype 为多实例作用域，每次从spring框架请求类的实例都会创建新的。不予@Lazy 一起使用
//@Scope("singleton")//此注解用于设置bean对象的作用域，默认为singleton(单例)，相同名字的bean的实例只能有一份
//    一般和 @Lazy 一起使用
//@Lazy //描述对象类型时表示延迟对象的创建，何时需要何时创建
//@Component("objectBool") //此注解描述的对象可以交给spring去管理，例如创建bean实例，给bean起一个默认的名字等
public class ObjectPool {// 默认bean对象名字为类名，然后首字母小写objectPool
    public ObjectPool(){
        System.out.println("ObjectPool()");
        Integer a1=100;//自动封箱
        Integer a2=100;//a1==a2?//true

        Integer a3=200;
        Integer a4=200;//a3==a4?//false
    }
    //生命周期方法演示：（并不是每个类中都要写这样的方法，一般在池对象的设计中都会有这样的方法）
    @PostConstruct //此注解描述的方法为对象生命初始化方法，在构造方法后执行
    public void init(){
        System.out.println("init");
    }
    @PreDestroy //此注解描述的方法为对象生命期销毁方法，此方法会在对象销毁之前执行
    public void destroy(){
        System.out.println("destroy()");
    }
}// 此类的配置在被加载到内存时，会将类的配置信息存储到Map<String,BeanDefinition>容器中
//spring中为什么会使用反射创建对象，而不是直接new 对象类型的方式呢？
